package com.chaoxing.controller;

import com.chaoxing.entity.User;
import com.chaoxing.service.UserService;
import com.chaoxing.util.PageUtil;
import org.apache.ibatis.annotations.Param;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@RestController
public class UserController {
    @Resource
    private UserService userService;

    /**
     * 用户注册
     *
     * @param user
     * @return
     */
    @PostMapping("/register.do")
    @Transactional
    public Map<String, String> receiveUserReg(User user) {
        Map<String, String> map = new HashMap<>();
        //用户名 注册判断是否为手机号
        String phone = user.getPhone();
//        String regExp = "^[1]([3][0-9]{1}|59|58|88|89)[0-9]{8}$";
//        Pattern pName = Pattern.compile(regExp);
//        Matcher mName = pName.matcher(phone);
//       if( phone.matches("^[1]([3][0-9]{1}|59|58|88|89)[0-9]{8}$")){
        if (phone.matches("^1[3-9]\\d{9}$")) {
            //第一位数字肯定是1
            //第二位数字只能是3或4或5或6或7或8或9
//               剩下的九位数字可以是0-9之间任意一位数字
//        if (mName.find()) {
            //表示判定是手机号，开始设置密码
            //密码要求  只能由字母、数字、下划线组成并且开头必须是字母，长度为6-8位
            String pwd = user.getPwd();
            if (pwd.matches("[a-zA-z]{1}[a-zA-Z0-9_]{5,7}")) {
                //先查询库中是否有该name，有的话不能插入
                String res = userService.selectByPhone(user.getPhone());
                if (res == null) {
                    //库中没有该用户，可以注册
                    int result = userService.insert(user);
                    if (result == 1) {
                        map.put("msg", "用户" + user.getPhone() + "注册成功！");
                        return map;
                    }
                } else {
                    //有该用户，用户名重复
                    map.put("msg", "该账号已注册过!");
                }
            } else {
                map.put("msg", "您输入的密码不符合要求，请重新设置！");
                return map;
            }
        } else {
            //输入的账号不合法
            map.put("msg", "输入的账号不合法,请重输!");
            return map;
        }
        return map;
    }

    /**
     * 用户登录
     * 根据登录时选择的身份不同，跳转到不同的页面：
     *
     * @param phone
     * @param pwd
     * @return
     */
    @PostMapping("/login.do")
    @Transactional
    public Map<String, String> loginSys(String phone, String pwd,
                                        HttpServletRequest request) {
        Map<String, String> map = new HashMap<>();
        Integer res = userService.loginSys(phone, pwd);
        if (res == 1) {
            //把user存到session中
            User user = userService.selectUser(phone, pwd);
            //没有session就新建一个session
            HttpSession session = request.getSession();
            session.setAttribute("User", user);
            map.put("msg", "success");
            map.put("userPhone", phone);
            return map;
        } else {
            map.put("msg", "登录失败,请检查用户名或密码是否正确!");
            return map;
        }
    }

    /**
     * 管理员的操作
     */
    //查询所有用户信息
    @RequestMapping("/selectAllUserByAd")
    public Map<String, List<User>> selectAllUserByAd(int pageNo) {
        Map<String, List<User>> map = new HashMap<>();
        int index = PageUtil.pageNoToIndex(pageNo);
        List<User> userList = userService.selectAllUserByAd(index, PageUtil.PAGE_SIZE);
        map.put("success", userList);
        return map;
    }

    //删除用户,在删除之前应先进行判断，该用户是否在user_course表中，
    //如果在，应当先删除其在user_course表中的数据
    @RequestMapping("/deleteUserByAd")
    @Transactional
    public Map<String, Integer> deleteUserByAd(Integer id) {
        Map<String, Integer> map = new HashMap<>();
        String msg = "删除成功!";
        //首先查询是否存在，如果在user_course中，则删除user_course，在删除t_user
        List<Integer> userIdList = userService.selectUserId(id);
        if (userIdList.size() == 0) {
            //如果为0，表示该用户不在user_course中，可以直接删除
            int i = userService.deleteUserByAd(id);
            if (i == 1) {
                map.put(msg, i);
            } else {
                map.put("删除失败，该用户不存在", i);
            }
        } else {
            //不为0，表示该用户在user_course中，不可以直接删除
            // 应该先删除user_course中的数据，在对t_user表进行操作
            userService.deleteUserById(id);
            int deleteId = userService.deleteUserByAd(id);
            if (deleteId == 1) {
                map.put(msg, deleteId);
            }
        }
        return map;
    }


    //管理员修改用户密码
    @RequestMapping("/updateUserByAd")
    @Transactional
    public Map<String, String> updateUserByAd(Integer id, String pwd) {
        Map<String, String> map = new HashMap<>();
        String msg = "密码修改失败!";
        if (pwd.matches("[a-zA-z]{1}[a-zA-Z0-9_]{5,7}")) {
            int i = userService.updateUserByAd(id, pwd);
            if (i == 1) {
                msg = "密码修改成功!";
                map.put(msg, pwd);
                return map;
            }
        } else {
            msg = "您输入的密码不符合要求，请重输!";
            map.put(msg, pwd);
        }
        return map;
    }

    //返回统计数据
    @RequestMapping("/calculation")
    public Map<String, String> calculation(int id) {
        System.out.println(id);
        Map<String, String> calculation = userService.calculation(id);
        return calculation;
    }

    //退出系统
    @RequestMapping("/exitSystem")
    public int exitSystem(HttpServletRequest request) {
        Integer i = userService.exitSystem(request);
        return i;
    }

    /**
     * 判断是否登录
     *
     * @param request
     * @return
     */
    @RequestMapping("/isLogin.do")
    public Map<String, Boolean> isLogin(HttpServletRequest request) {
        HttpSession session = request.getSession(false);
        Map<String, Boolean> map = new HashMap<>();
        if (session == null) {
            map.put("isLogin", false);
            return map;
        }
        map.put("isLogin", true);
        return map;
    }

    /**
     * 判断身份
     *
     * @param request
     * @return
     */
    @RequestMapping("/selectRegion.do")
    public Map<String, String> selectRegion(HttpServletRequest request) {
        HttpSession session = request.getSession(false);
        Map<String, String> map = new HashMap<>();
        if (session == null) {
            map.put("region", "尚未登录!");
        } else {
            User user = (User) session.getAttribute("User");
            map.put("region", user.getRegion());
        }
        return map;
    }

    /**
     * 根据id查询用户
     *
     * @param id
     * @return
     */
    @RequestMapping("/selectByPrimaryKey")
    public Map<String, User> selectByPrimaryKey(Long id) {
        Map<String, User> map = new HashMap<>();
        User user = userService.selectByPrimaryKey(id);
        if (user != null) {
            map.put("success", user);
        }
        map.put("false", null);
        return map;
    }

    /**
     * 查询教师信息
     * @return
     */
    @RequestMapping("/findTeacher")
    public Map<String,List<User>> queryAllTeacher(){
        List<User> teachers = userService.selectTeacher();
        Map<String,List<User>> map = new HashMap<>();
        if(teachers.size() > 0){
            map.put("resp",teachers);
            return map;
        }
        map.put("errMsg",null);
        return map;
    }
}
